import ctypes
from PineaPy.Pinea import *


class Input:
    """输入管理类，跟踪按键状态"""
    _key_states = {}
    
    @staticmethod
    def update(key, pressed):
        Input._key_states[key] = pressed
    
    @staticmethod
    def isKeyPressed(key):
        return Input._key_states.get(key, False)
    
    @staticmethod
    def isKeyDown(key):
        # 简化实现，实际可能需要更复杂的状态跟踪
        return Input._key_states.get(key, False)

class PineaTest:
    def run(self):
        # 初始化引擎，创建标题为"PineaTest"、尺寸800x600的窗口
        pineaInit("PineaTest", 800, 600)
        event = PineaEvent()  # 事件对象
        bgColor = PineaColor(50, 50, 50, 255)  # 背景色（深灰色）- 注意：这里假设颜色是0-1范围
        
        # 测试矩形（位置、大小和颜色）
        rect = PineaRect(100, 150, 60, 60)
        rectColor = PineaColor(30, 30, 30, 255)  # 注意：这里假设颜色是0-1范围
        
        # 加载图像资源
        bgImage = pineaLoadImage("Pinea/PineaTest/assets/images/bg.png")           # 背景图
        playerImage = pineaLoadImage("Pinea/PineaTest/assets/images/mario.png")    # 玩家图像
        
        # 玩家图像源区域（从原图裁剪的区域）和目标区域（屏幕上绘制的位置和大小）
        playerSrc = PineaRect(16 * 6, 16 * 2, 16, 16)
        playerDst = PineaRect(100, 200, 16 * 2.68, 16 * 2.68)
        
        # 加载音频资源
        bgm = pineaLoadMusic("Pinea/PineaTest/assets/sounds/bgm.mp3")        # 背景音乐
        pineaPlayMusic(bgm, True)                                           # 循环播放背景音乐
        jumpSound = pineaLoadSound("Pinea/PineaTest/assets/sounds/jump.wav") # 跳跃音效
        
        # 时间控制变量（用于固定帧率更新）
        lastTime = pineaGetTime()      # 上一帧时间
        currentTime = 0                # 当前时间
        accTime = 0                    # 累计时间
        deltaTime = 1000000000 // 60   # 每帧目标时间（60帧/秒，单位：纳秒）
        deltaTimeF = 1 / 60.0          # 每帧时间（秒）
        
        pineaShow()  # 显示窗口
        
        # 主循环标志
        running = True
        while running:
            # 事件处理循环：处理所有待处理事件
            while pineaPollEvent(event):
                if event.type == PINEA_EVENT_QUIT:
                    # 窗口关闭事件：退出主循环
                    running = False
                elif event.type == PINEA_EVENT_KEY_DOWN:
                    # 按键按下事件：更新按键状态为按下
                    Input.update(event.key, True)
                elif event.type == PINEA_EVENT_KEY_UP:
                    # 按键释放事件：更新按键状态为释放
                    Input.update(event.key, False)
                else:
                    # 输出其他事件信息（调试用）
                    print(f"{event.type},{event.key},{event.x},{event.y}")
            
            # 时间更新：计算帧间隔并累计时间
            currentTime = pineaGetTime()
            accTime += currentTime - lastTime
            lastTime = currentTime
            
            # 固定帧率更新：当累计时间达到目标帧时间时执行更新
            if accTime >= deltaTime:
                while accTime >= deltaTime:
                    accTime -= deltaTime
                    
                    # 游戏逻辑更新
                    # 键盘控制玩家移动（WASD键）
                    if Input.isKeyPressed(PINEA_KEY_A):
                        playerDst.x -= deltaTimeF * 250  # 左移
                    if Input.isKeyPressed(PINEA_KEY_D):
                        playerDst.x += deltaTimeF * 250  # 右移
                    if Input.isKeyPressed(PINEA_KEY_W):
                        playerDst.y -= deltaTimeF * 250  # 上移
                    if Input.isKeyPressed(PINEA_KEY_S):
                        playerDst.y += deltaTimeF * 250  # 下移
                    
                    # 空格键播放跳跃音效
                    if Input.isKeyDown(PINEA_KEY_SPACE):
                        pineaPlaySound(jumpSound, 0)
                    
                    # H键播放背景音乐
                    if Input.isKeyDown(PINEA_KEY_H):
                        pineaPlayMusic(bgm, True)
                    
                    # J键暂停音乐
                    if Input.isKeyDown(PINEA_KEY_J):
                        pineaPauseMusic()
                    
                    # K键恢复音乐
                    if Input.isKeyDown(PINEA_KEY_K):
                        pineaResumeMusic()
                    
                    # L键停止音乐
                    if Input.isKeyDown(PINEA_KEY_L):
                        pineaStopMusic()
                
                # 渲染部分
                pineaClear(bgColor)  # 清空屏幕为背景色
                
                # 绘制背景图（全屏绘制）
                pineaDrawImage(bgImage, None, None, 0, 0)
                
                # 绘制测试矩形
                pineaFillRect(rect, rectColor)
                
                # 绘制玩家图像（带旋转和翻转效果）
                pineaDrawImage(
                    playerImage, 
                    playerSrc, 
                    playerDst, 
                    30, 
                    PINEA_FLIP_HORIZONTAL | PINEA_FLIP_VERTICAL
                )
                
                pineaRender()  # 刷新屏幕显示
        
        # 释放资源
        pineaDropImage(bgImage)
        pineaDropImage(playerImage)
        pineaDropMusic(bgm)
        pineaDropSound(jumpSound)
        pineaQuit()  # 退出引擎并释放所有资源

if __name__ == "__main__":
    PineaTest().run()
    